package cn.itcast.service.cargo.impl;



import cn.itcast.dao.cargo.ContractDao;
import cn.itcast.dao.cargo.ContractProductDao;

import cn.itcast.dao.cargo.ExtCproductDao;
import cn.itcast.domain.cargo.*;
import cn.itcast.service.cargo.ContractProductService;


import com.alibaba.dubbo.config.annotation.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.UUID;


@Service
public class ContractProductServiceImpl implements ContractProductService {
    @Autowired
    private ContractProductDao contractProductDao;
    @Autowired
    private ContractDao contractDao;
    @Autowired
    private ExtCproductDao  extCproductDao;



    /**
     * 分页查询
     *
     * @param ContractProductExample 分页查询的参数
     * @param pageNum                当前页
     * @param pageSize               页大小
     * @return
     */
    @Override
    public PageInfo<ContractProduct> findByPage(ContractProductExample ContractProductExample, int pageNum, int pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        List<ContractProduct> contractProductList = contractProductDao.selectByExample(ContractProductExample);

        return new PageInfo<>(contractProductList);
    }

    /**
     * 查询所有
     *
     * @param ContractProductExample
     */
    @Override
    public List<ContractProduct> findAll(ContractProductExample ContractProductExample) {
        return contractProductDao.selectByExample(ContractProductExample);
    }

    /**
     * 根据id查询
     *
     * @param id
     */
    @Override
    public ContractProduct findById(String id) {
        return contractProductDao.selectByPrimaryKey(id);
    }

    /**
     * 新增
     *
     * @param contractProduct
     */
    @Override
    public void save(ContractProduct contractProduct ) {
        contractProduct.setId(UUID.randomUUID().toString());

        //1. 计算货物金额
        Double amount=0d;
        if (contractProduct.getPrice()!=null&&contractProduct.getCnumber()!=null){
            //1.1.货物的金额等于单价*数量，获取单价
            Double price = contractProduct.getPrice();
            //1.2获取货物的数量
            Integer cnumber = contractProduct.getCnumber();
            //货物的总金额,且设置到货物对象中去
            amount=price*cnumber;
            contractProduct.setAmount(amount);
        }

        //2. 修改购销合同总金额
        //2.1 获得改之前的总金额+货物金额,根据购销合同的id去查询总金额
        String contractId = contractProduct.getContractId();
        Contract contract = contractDao.selectByPrimaryKey(contractId);
        //设置总金额
        contract.setTotalAmount(contract.getTotalAmount()+amount);
        //设置数量
        contract.setProNum(contract.getProNum()+1);
        //修改注销合同
        contractDao.updateByPrimaryKeySelective(contract);

        //3. 添加货物
        contractProductDao.insertSelective(contractProduct);


    }

    /**
     * 修改
     *
     * @param contractProduct
     */
    @Override
    public void update(ContractProduct contractProduct) {
        //1.计算修改后的货物金额
        Double amcount=0d;
        if (contractProduct.getPrice()!=null && contractProduct.getCnumber()!=null){
            //计算修改后的货物金额
            amcount=contractProduct.getPrice()*contractProduct.getCnumber();
            //保存到货物中
            contractProduct.setAmount(amcount);
        }
        //2.根据货物id查询数据库中的货物金额
        String id = contractProduct.getId();
        ContractProduct product = contractProductDao.selectByPrimaryKey(id);
        //获取修改前货物的金额
        Double oldAmount = product.getAmount();
        //3.修改购销合同总金额=总金额+修改后-修改前
        //根据合同id去查询合同总金额
        Contract contract = contractDao.selectByPrimaryKey(product.getContractId());
        //合同的总金额
        Double totalAmount = contract.getTotalAmount();
        //计算修改后的总金额
        contract.setTotalAmount(totalAmount+amcount-oldAmount);
        //修改购销合同
        contractDao.updateByPrimaryKeySelective(contract);
        contractProductDao.updateByPrimaryKeySelective(contractProduct);
    }

    /**
     * 需求：删除货物
     *
     * |-- 购销合同
     *    |-- 货物       删除货物，同时把货物的附件也删除；还要累加附件的金额。
     *       |-- 附件1
     *       |-- 附件2
     */
    @Override
    public void delete(String id) {
        //1. 根据货物id，查询货物对象, 获取货物金额.
        ContractProduct contractProduct = contractProductDao.selectByPrimaryKey(id);
        //获取货物金额
        Double amount = contractProduct.getAmount();
        //根据货物对象得到购销合同id
        String contractId = contractProduct.getContractId();

        //2. 根据货物id，查询附件
        //因为需要查询附件，所有构建查询对象
        ExtCproductExample extCproductExample=new ExtCproductExample();
        extCproductExample.createCriteria().andContractProductIdEqualTo(id);
        //根据id查询货物下的附件

        List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);
        Double extcAmount=0d;
        if (extCproductList!=null&&extCproductList.size()>0){
            //遍历所有的附件，得到附件的金额，进行累加
            for (ExtCproduct extCproduct : extCproductList) {
                //进行累加
                 extcAmount+=extCproduct.getAmount();
                 //删除货物下的附件
                extCproductDao.deleteByPrimaryKey(extCproduct.getId());
            }
        }

        //3. 修改购销合同总金额、货物数量、附件数量
        //根据购销合同id得到购销合同对象
        Contract contract = contractDao.selectByPrimaryKey(contractId);
        //修改总金额
        contract.setTotalAmount(contract.getTotalAmount()-amount-extcAmount);
        //修改货物数量
        contract.setProNum(contract.getProNum()-1);
        //修改附件的数量
        contract.setExtNum(contract.getExtNum()-extCproductList.size());
        //修改购销合同
        contractDao.updateByPrimaryKeySelective(contract);
        //删除货物
        contractProductDao.deleteByPrimaryKey(id);

    }
}
